package reflection;

import java.lang.reflect.Field;

/**
 * 通过反射访问类中成员
 */
public class ReflectAccessProperty {

    public static void main(String[] args) throws Exception {

        /*
            1.根据属性名获取 Field 对象
            Field f = clazz对象.getDeclareField(属性名);
            2.爆破
            f.setAccessible(true);//f是Field
            3.修改并访问
            f.set(o, 值);

            tips:如果是静态属性，则 set 和 get 中的参数o，可以写成null
         */
        //1.得到Student类对应的Class对象
        Class<?>stuClass = Class.forName("reflection.Student");
        //2.创建对象
        Object o = stuClass.newInstance();//o的运行类型就是Student
        System.out.println(o.getClass());//Student

        //3. 使用反射得到age 属性对象
        Field age = stuClass.getField("age");
        age.set(o, 88);//通过反射来操作属性
        System.out.println(o);//
        System.out.println(age.get(o));//返回 age 属性的值

        //4. 使用反射操作name 属性
        Field name = stuClass.getDeclaredField("name");
        //对 name 进行暴破, 可以操作private 属性
        name.setAccessible(true);
        //name.set(o, "老韩");
        name.set(null, "老韩~");//因为 name 是 static 属性，因此 o 也可以写出null
        System.out.println(o);
        System.out.println(name.get(o)); //获取属性值
        System.out.println(name.get(null));//获取属性值, 要求 name 是 static
    }
}
